<!DOCTYPE html>

<head>
    <meta charset="UTF-8">
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="format-detection" content="telephone=no">
    <title>jsapidemo首页</title>
    <style type="text/css">
        .long_button {
            display: block;
            border: 1px solid;
            font-weight: 700;
            margin: 5px;
            height: 33px;
            line-height: 33px;
            text-align: center;
            letter-spacing: 0.5em;
            color: #fff;
            background-color: #0a7e81;
        }

        #file_input {
            width: 10px;
            filter: alpha(opacity=0);
            opacity: 0;
            position: absolute;
            left: 0px;
            top: 0px;
            z-index: 10;
        }

        #div {
            margin: 0 auto;
            width: 80%;
            border: 1px solid red;
            overflow: hidden;
        }
    </style>
</head>

<body>
    <p>单点登录.获取用户信息</p>
    <span id="name" style="color:green"></span>
    <div>
        <span>姓名:</span>
        <span id="name" style="color:red">liudl</span>
    </div>
    <div>
        <span>用户id:</span>
        <span id="userId" style="color:red">59b1fdb80cf253f140c977f6</span>
    </div>
    <div>
        <span>用户名:</span>
        <span id="username" style="color:red">刘典良</span>
    </div>
    <p id="p_test">测试</p>
    <div id="main">

    </div>
    <button onclick="chearnUp()">清空测试结果</button>
    <br>
    <p> 登录功能 </p>
    <a class="long_button" onclick="qrLogin()">扫码登录</a>
    <div id="qrDiv" hidden style="text-align: center">
        <img id="qrImg">
        <a onclick="getTicket()" style="display: block;cursor: pointer;">刷新获取二维码</a>
        <span id="qrInfo" style="display: block;color:red;"></span>
    </div>

    <p> 手写功能 </p>

    <a class="long_button preview" onclick="sign()">获取</a>
    <a class="long_button preview" onclick="signUpdate()">更新</a>
    <a class="long_button preview" onclick="signOpen()">打开</a>

    <p> 相机功能 </p>

    <a class="long_button preview" onclick="chooseImageFromAlbum()">从相册选择</a>
    <a class="long_button preview" onclick="chooseImage()">拍照</a>
    <a class="long_button" onclick="previewImage()">预览图片</a>
    <a class="long_button preview" onclick="uploadImageH5()">H5中默认图片上传</a>
    <input type="file" id="file_input" name="file_input" />
    <a class="long_button" onclick="uploadImage()">上传图片 </a>
    <a class="long_button" onclick="downloadImage()">下载图片 </a>
    <p> 录音/音频 </p>
    <a class="long_button" onclick="startRecord()">开始录音</a>
    <a class="long_button" onclick="stopRecord()">停止录音</a>
    <a class="long_button" onclick="onVoiceRecordEnd()">监听录音自动停止</a>
    <a class="long_button" onclick="playVoice()">播放语音</a>
    <a class="long_button" onclick="pauseVoice()">暂停播放</a>
    <a class="long_button" onclick="stopVoice()">停止播放</a>
    <a class="long_button" onclick="onVoicePlayEnd()">监听语音播放完毕</a>
    <a class="long_button" onclick="uploadVoice()"> 上传语音 </a>
    <a class="long_button" onclick="downloadVoice()"> 下载语音 </a>

    <p> 获取设备信息功能 </p>
    <a class="long_button" onclick="getNetworkType()">获取设备网络状态</a>

    <p> 地理位置 </p>
    <a class="long_button" onclick="getLocation()">返回当前位置经纬度</a>
    <a class="long_button" onclick="openLocation()">内置地图查看位置</a>


    <p> 扫码功能 </p>
    <a class="long_button" onclick="scanQRCode()">扫描二维码</a>

    <p> 身份验证 </p>
    <a class="long_button" onclick="isGestureCodeSet()">手势是否设置</a>
    <a class="long_button" onclick="gestureUnlock()">手势验证</a>
    <a class="long_button" onclick="isCanAuthenticate()">是否支持指纹</a>
    <a class="long_button" onclick="canAuthenticate()">指纹验证</a>

    <p> 人脸识别 </p>
    <a class="long_button" onclick="faceRecognition()">查询人脸识别是否可用</a>
    <a class="long_button" onclick="faceOpen()">开启人脸识别</a>
    <a class="long_button" onclick="faceLiveVerify()">活体识别</a>
    <a class="long_button" onclick="facePunchCard()">人脸识别打卡</a>


    <p> 通讯录 </p>
    <a class="long_button" onclick="addressBookChoose()">通讯录选人</a>

    <p> 文件操作 </p>
    <a class="long_button" onclick="docPreview()">预览文件</a>
    <a class="long_button" onclick="downloadFileIntoApp()">文件下载到App中</a>

    <p> 窗口操作 </p>
    <a class="long_button" onclick="windowOpen()">打开一个新的窗口</a>
    <a class="long_button" onclick="windowClose('this')">关闭窗口</a>

    <a class="long_button" onclick="windowAlert('窗口内容')">弹出一个警告窗口</a>
    <a class="long_button" onclick="confirm('测试内容')">弹出一个确认窗口</a>
    <a class="long_button" onclick="windowAlertInput()">弹出一个可输入内容的提示窗口</a>
    <a class="long_button" onclick="windowRefresh('001')">刷新指定窗口</a>

    <p> 界面功能 </p>
    <a class="long_button" onclick="navigateTo()">保留当前页面跳转</a>
    <a class="long_button" onclick="redirectTo()">关闭当前页面跳转</a>
    <a class="long_button" onclick="navigateBack()">关闭当前页面回退前一页</a>

    <p> 标题栏设置 </p>
    <a class="long_button" onclick="windowSetTitle()">设置标题栏内容</a>
    <a class="long_button" onclick="optionMenu()">菜单按钮</a>

    <p> 应用服务号 </p>
    <a class="long_button" onclick="publicSignPage()">消息推送</a>

    <p> 跳转到群 </p>
    <a class="long_button" onclick="createImSession()">跳转到群</a>

    <p> 金格 </p>
    <a class="long_button" onclick="iAppOffice()">金格</a>
    <a class="long_button" onclick="request()">request</a>

    <a class="long_button" onclick="videoStart()">video.start</a>

    <script src="jsapiDemo/js/jquery-2.1.1.js" type="text/javascript"></script>

    <script type="text/javascript">

        var localId; // 全局localId
        var serverId // 全局serverId
        var input; // 全局_h5_file_input
        var $main; // 测试div
        var timer;

        $(function () {
            $main = $("#main");
            // 按钮清除事件
            $(".preview").click(function () {
                chearnUp();
            });
            input = document.getElementById("file_input");
            if (typeof FileReader === 'undefined') {
                confirm("抱歉，你的浏览器不支持 FileReader");
                input.setAttribute('disabled', 'disabled');
            } else {
                // input文件表单事件监听
                input.addEventListener('change', readFile, false);
            }
        });

        function getTicket() {
            if (timer) {
                window.clearInterval(timer);
            }
            $.ajax({
                type: "GET",
                url: "/h5online/qrLogin?type=getTicket",
                dataType: "json",
                success: function (data) {
                    if (data.qrImage) {
                        var $qrImg = $("#qrImg");
                        $qrImg.attr("src", data.qrImage)
                        $qrImg.attr("name", data.ticket)
                        timer = setInterval("refleshQRStatus('" + data.ticket + "')", 3000);
                    }
                }
            });
        }

        function chearnUp() {
            $main.html("");
            $("#p_test").html("测试");
        }

        // 1.0 需要检测的JS接口列表
        function sign() {
            emp.signature.get({
                success: function (res) {
                    var urlPath = res.urlPath; // 返回签名的服务端地址，如果为空，则调取`更改`接口
                    confirm(res);
                }
            });
        }

        function signUpdate() {
            emp.signature.update({
                success: function (res) {
                    var result = res.result;     // 更新结果, true更新成功，false更新失败
                    var urlPath = res.urlPath;    // 返回签名的服务端地址
                    confirm(res);
                }
            });
        }

        function signOpen() {
            emp.signature.open({
                success: function (res) {
                    var result = res.result;        // 保存结果, true保存成功，false保存失败
                    var base64 = res.base64;        // 返回签名的base64
                    confirm(res);
                }
            });
        }

        // 1.0 需要检测的JS接口列表
        function checkJsApi() {
            wx.checkJsApi({
                // 需要检测的JS接口列表
                jsApiList: ['chooseImage'],
                success: function (res) {
                    // 以键值对的形式返回，可用的api值true，不可用为false
                    // 如：{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
                    confirm(res);
                }
            });

        }

        function chooseImageFromAlbum() {
            wx.chooseImage({
                count: 1, // 选择照片个数,默认9  可以指定是原图还是压缩图，默认二者都有
                sizeType: ['original', 'compressed'], // 可以指定来源是相册还是相机，默认二者都有
                sourceType: ['album'],
                success: function (res) {
                    // 返回选定照片的本地ID列表，
                    // localId可以作为img标签的src属性显示图片
                    $("#p_test").html("测试 api: Images [" + res.localIds + "]")

                    var ids = res.localIds;
                    for (var i = 0; i < ids.length; i++) {
                        localId = ids[i];
                        $img = $("<img />");
                        $img.attr("src", ids[i]);
                        $img.css("width", "80%");
                        $main.append($img);
                    }

                }
            });
        }
        // 2. 相机功能
        // 2.1 拍照或者从相册选择
        function chooseImage() {
            wx.chooseImage({
                count: 1, // 选择照片个数,默认9  可以指定是原图还是压缩图，默认二者都有
                sizeType: ['original', 'compressed'], // 可以指定来源是相册还是相机，默认二者都有
                sourceType: ['camera'],
                success: function (res) {
                    // 返回选定照片的本地ID列表，
                    // localId可以作为img标签的src属性显示图片
                    $("#p_test").html("测试 api: Images [" + res.localIds + "]")

                    var ids = res.localIds;
                    for (var i = 0; i < ids.length; i++) {
                        localId = ids[i];
                        $img = $("<img />");
                        $img.attr("src", ids[i]);
                        $img.css("width", "80%");
                        $main.append($img);
                    }

                }
            });
        }

        // 2.2 预览图片
        function previewImage() {
            wx.previewImage({
                current: "http://menhu.ishangban.com/h5online/upload/file/1.jpg", // 当前显示图片的http链接
                urls: ["http://menhu.ishangban.com/h5online/upload/file/1.png", "http://menhu.ishangban.com/h5online/upload/file/2.png"] // 需要预览的图片http链接列表
            });
        }

        // 2.3 上传图片
        function uploadImage() {
            if (!localId) {
                confirm("请先 拍照 或从相册选择一张照片 localId : " + localId);
                return;
            }
            wx.uploadImage({
                localId: localId, // 需要上传的图片的本地ID，由chooseImage接口获得
                isShowProgressTips: 1, // 默认为1，显示进度提示
                success: function (res) {
                    serverId = res.serverId; // 返回图片的服务器端ID
                    confirm("serverId : " + serverId);
                }
            });
        }

        // 2.4 下载图片
        function downloadImage() {

            if (!serverId) {
                confirm("请先 上传 照片 获取serverId : ");
                return;
            }
            wx.downloadImage({
                serverId: serverId, // 需要下载的图片的服务器端ID，由uploadImage接口获得
                isShowProgressTips: 1, // 默认为1，显示进度提示
                success: function (res) {
                    var localId = res.localId; // 返回图片下载后的本地ID
                    confirm("localId : " + localId);

                }
            });
        }

        // 2.5 H5上传图片
        function uploadImageH5() {
            input.click();
        }

        function readFile() {
            var file = input.files[0]; //获取file对象

            var reader = new FileReader(); //声明一个FileReader实例
            reader.readAsDataURL(file); //调用readAsDataURL方法来读取选中的图像文件
            reader.onload = function (e) {
                var $tmp;
                if (/image\/\w+/.test(file.type)) {
                    $tmp = $("<img />");
                    $tmp.attr("src", this.result);
                } else if (file.type.indexOf("video") >= 0) {
                    $tmp = $("<video />");
                    $tmp.attr("src", this.result);
                    $tmp.attr("controls", "autoplay");
                } else if (file.type.indexOf("audio") >= 0) {
                    $tmp = $("<audio />");
                    $tmp.attr("src", this.result);
                    $tmp.attr("controls", "autoplay");
                } else {
                    $tmp = $("<span />");
                    $tmp.html("上传文件有误/" + file.type);
                }
                $tmp.css("width", "80%");
                $("#p_test").html("测试 h5:[" + file.type + "]")
                $main.append($tmp);
            }
        }

        // 3. 录音/音频
        // 3.1 开始录音
        // 启动手机录音
        function startRecord() {
            wx.startRecord({});
        }

        // 3.2 停止录音
        // 停止录音
        function stopRecord() {
            wx.stopRecord({
                success: function (res) {
                    localId = res.localId;
                    confirm("localId : " + localId);
                }
            });
        }

        // 3.3 监听录音自动停止
        // 监听录音自动停止接口
        // 在移动门户H5微信应用容器中，录音时间长度限制视系统设置而定，不一定是一分钟。
        function onVoiceRecordEnd() {
            wx.onVoiceRecordEnd({
                // 录音时间超过一分钟没有停止的时候会执行 complete 回调
                complete: function (res) {
                    var localId = res.localId;
                    confirm("localId : " + localId);
                }
            });
        }

        // 3.4 播放语音接口
        // 播放语音接口
        function playVoice() {
            wx.playVoice({
                localId: localId// 需要播放的音频的本地ID，由stopRecord接口获得
            });
        }

        // 3.5 暂停播放接口
        // 暂停播放接口
        function pauseVoice() {
            wx.pauseVoice({
                localId: localId // 需要暂停的音频的本地ID，由stopRecord接口获得
            });
        }

        // 3.6 停止播放接口
        // 停止播放接口
        function stopVoice() {
            wx.stopVoice({
                localId: localId // 需要停止的音频的本地ID，由stopRecord接口获得
            });
        }

        // 3.7 监听语音播放完毕
        // 监听语音播放完毕接口
        function onVoicePlayEnd() {
            wx.onVoicePlayEnd({
                success: function (res) {
                    localId = res.localId; // 返回音频的本地ID
                    confirm("localId :" + localId);
                }
            });
        }

        // 3.8 上传语音接口
        // 上传语音接口
        function uploadVoice() {
            if (!localId) {
                confirm("录音为空,请先录音 localId : " + localId)
                return;
            }
            wx.uploadVoice({
                localId: localId, // 需要上传的音频的本地ID，由stopRecord接口获得
                isShowProgressTips: 1, // 默认为1，显示进度提示
                success: function (res) {
                    serverId = res.serverId; // 返回音频的服务器端ID
                    confirm("serverId : " + serverId);
                }
            });
        }

        // 3.9 下载语音接口
        // 下载语音接口
        function downloadVoice() {
            if (!serverId) {
                confirm("请先 上传 语音 获取serverId : ");
                return;
            }
            wx.downloadVoice({
                serverId: '000001', // 需要下载的音频的服务器端ID，由uploadVoice接口获得
                isShowProgressTips: 1, // 默认为1，显示进度提示
                success: function (res) {
                    var localId = res.localId; // 返回音频的本地ID
                    confirm("localId : " + localId);

                }
            });
        }

        // 4. 获取设备信息功能
        // 4.1 获取设备网络状态
        function getNetworkType() {
            wx.getNetworkType({
                success: function (res) {
                    var networkType = res.networkType; // 返回网络类型2g，3g，4g，wifi
                    var wifi_ssid = res.wifi_id; //Wifi_ssid
                    confirm(networkType);
                }
            });

        }

        // 5. 地理位置
        // 5.1 返回当前位置经纬度
        //
        // 注意：
        // 0. 目前只集成了百度地图
        // 1. 绝对经纬度没有理解是什么意思，目前返回值皆为 0
        // 2. 定位类型 没有理解清楚，目前是返回 type 的值
        function getLocation() {
            emp.getLocation({
                type: 'wgs84', // 默认为wgs84的gps坐标
                success: function (res) {
                    var latitude = res.latitude; // 相对纬度（定位引擎直接返回经纬度），浮点数，范围为90 ~ -90
                    var longitude = res.longitude; // 相对经度（定位引擎直接返回原始经纬度），浮点数，范围为180 ~ -180。
                    var accuracy = res.accuracy; // 位置精度
                    var address = res.address; // 定位地址
                    var reslatitude = res.wgs84.latitude; //wgs绝对纬度（通过算法获取）
                    var reslongtitude = res.wgs84.longtitude; //绝对经度（通过算法获取）

                    confirm(latitude + " - " + longitude + " - " + accuracy + " - " + address + " - " + reslatitude);

                },
            });
        }

        // 5.2 内置地图查看位置
        // 打开应用内置地图，查看位置。
        // 系统需要根据传入经纬度为中心，显示地图，同时显示当前设备定位位置，需要将两个点显示在同一个地图窗口中，因此需要自动计算适合的地图缩放位置，保证两个点同时能显示
        //
        // 注意：
        // 0. 输入坐标默认为 BD09 坐标，建议此处加参数 type 用于制定坐标类型
        // 1. 由于需求为将输入坐标和当前定位位置显示在同一地图窗口，所以输入的参数 scale 无效
        // 2. 目前 infoUrl 参数无效，功能未实现
        function openLocation() {
            wx.openLocation({
                latitude: 39.8999640183, // 纬度，浮点数，范围为90 ~ -90
                longitude: 116.3279031643, // 经度，浮点数，范围为180 ~ -180。
                name: '北京西站', // 位置名
                address: '北京市丰台区莲花池东路118号', // 地址详情说明
                scale: 1, // 地图缩放级别,整形值,范围从1~28。默认为最大 百度地图在手机上当前可使用的级别为3-21级
                type: 'wgs84',
                infoUrl: '' // 在查看位置界面底部显示的超链接,可点击跳转
            });
        }

        // 6. ibeacon
        // 6.1 开启查找周边ibeacon设备
        function startSearchBeacons() {
            wx.startSearchBeacons({
                ticket: "",  //摇周边的业务ticket, 系统自动添加在摇出来的页面链接后面
                complete: function (argv) {
                    //开启查找完成后的回调函数
                    windowAlert(argv);
                }
            });
        }

        // 6.2 关闭查找周边ibeacon设备
        function stopSearchBeacons() {
            wx.stopSearchBeacons({
                complete: function (res) {
                    //关闭查找完成后的回调函数
                    windowAlert(argv);
                }
            });
        }

        // 6.3 监听周边ibeacon设备接口
        function onSearchBeacons() {
            wx.onSearchBeacons({
                complete: function (argv) {
                    //回调函数，可以数组形式取得该商家注册的在周边的相关设备列表
                    windowAlert(argv);
                }
            });
        }

        // 7. 扫描功能
        // 7.1 二维码扫描
        function scanQRCode() {
            wx.scanQRCode({
                needResult: 1, // 默认为0，扫描结果由App处理，1则直接返回扫描结果，
                scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是一维码，默认二者都有
                success: function (res) {
                    var result = res.resultStr; // 当needResult 为 1 时，扫码返回的结果
                    confirm("qrCode : " + result);
                }
            });
        }

        // 8 身份验证
        // 8.1 手势验证
        // emp.gestureUnlock对象封装了用于调用手势解锁功能的方法,可以调用移动门户App中手势解锁验证界面进行解锁验证.
        // 8.1.1 手势是否设置
        // 检测系统储存中是否存在已设置的手势密码
        function isGestureCodeSet() {
            // var ret = gestureUnlock.isGestureCodeSet(); //已设置手势密码时返回true,否则返回false
            emp.gestureUnlock.isGestureCodeSet({
                success: function (e) {
                    confirm(e.result); // 1 是有
                }
            });
        }

        // 8.1.2 手势验证
        // 打开插件页面进行验证手势密码操作
        function gestureUnlock() {
            emp.gestureUnlock.verify({
                success: function (res) { //验证调用成功
                    var result = res.result; //验证结果,true符合，false不符合
                },
                error: function (res) { //验证调用失败
                }
            });

        }

        // 8.2 指纹验证
        // emp.touchId对象封装了用于调用系统TouchID功能的方法，可以调用系统TouchID验证界面进行指纹识别。 TouchID功能接口只适用iOS8.0以上系统且支持指纹识别的设备。
        // 8.2.1 是否支持指纹
        // 校验当前应用是否支持指纹验证
        // var ret = emp.touchID.canAuthenticate();//支持指纹验证返回true,否则返回false
        function isCanAuthenticate() {
            emp.touchID.canAuthenticate({
                success: function (e) {
                    confirm(JSON.stringify(e)); // 1 是有
                }
            });
        }

        // 8.2.2 指纹验证
        // 开始指纹验证
        function canAuthenticate() {
            emp.touchID.authenticate({
                mode: 0, //验证模式, 0 默认的指纹验证模式,仅当指纹验证通过时返回成功; 1 允许用户使用设备密码代替指纹进行验证
                success: function (res) { //验证调用成功
                    var result = res.result; //验证结果,true符合，false不符合
                }
            });
        }

        // 人脸识别
        function faceRecognition() {
            emp.face.recognition({
                success: function (res) {
                    var result = res.result; // 验证结果,true可用，false不可用
                    var resultStr = result ? "可用" : "不可用";
                    confirm(resultStr);
                }
            });
        }

        function faceOpen() {
            emp.face.open({
                success: function (res) {
                    var result = res.result; // 开启结果,true开启成功，false开启失败  
                    var resultStr = result ? "开启成功" : "开启失败";
                    confirm(resultStr);
                }
            });
        }

        function faceLiveVerify() {
            emp.face.liveVerify({
                faceType: '考勤', //非必填项, 调用人脸识别的功能模块名称, 用户后台统计. 模块使用频率
                success: function (res) {
                    var result = res.result;  // 验证结果,true验证成功，false验证失败
                    var msg = res.msg;      // 验证结果描述 
                    confirm(JSON.stringify(res));
                }
            });
        }

        function facePunchCard() {
            emp.face.punchCard({
                userName: '录入用户姓名',
                address: '录入打卡地址',
                success: function (res) {
                    confirm(JSON.stringify(res));
                }
            });
        }


        // // 9. 通讯录
        // // 9.1 通讯录选人
        // // 调用原生通讯录选人：
        function addressBookChoose() {

            emp.addressBook.choose({
                startWithDepartmentId: -1, //-1表示打开的通讯录从自己所在部门开始展示, 0表示从企业最上层开始，(其他数字表示从该部门开始:暂时不支持)
                multiple: true, //是否多选： true多选 false单选； 默认true
                users: ['111', '22'], //默认选中的用户列表，userid；成功回调中应包含该信息
                disabledUsers: ['10001', '10002'],// 不能选中的用户列表，员工userid
                corpId: '00', //企业id
                max: 20, //人数限制，当multiple为true才生效，可选范围1-1500
                limitTips: "hehe", //超过人数限制的提示语可以用这个字段自定义
                isNeedSearch: true, // 是否需要搜索功能
                title: "xxx", // 如果你需要修改选人页面的title，可以在这里赋值
                local: "true", // 是否显示本地联系人，默认false
                success: function (data) {
                    confirm(JSON.stringify(data));
                }
            });
        }


        // 10. 文件下载
        // 10.1 本地文件访问
        // 通过<input type-file> 控件，选择文件后，将文件地址设置给 image src，image控件应该可以显示该图片。H5容器应该可以处理 file:// 开头的文件路径。相同方式，也可以将本地文件用于语音播放、录像播放等场景。

        // 10.11 文件下载倒服务器中
        function downloadFileIntoServer() {
            if (!serverId) {
                confirm("请上传文件 !! serverId :" + serverId);
                return;
            }

            $.ajax({
                type: "GET",
                dataType: 'json',
                url: "downloadMedia?media_id=" + serverId,
                success: function (data) {
                    if (data.code == 200) {
                        confirm("文件保存服务器成功!\nPath : " + data.filePath);
                    } else {
                        confirm("文件保存失败!\nmsg : " + data.errorMsg);
                    }
                }
            });
        }

        // 10.2 文件下载到App中
        // 将远程服务器上的文件下载到App应用的目录中，应用存储路径的根目录遵循移动门户App的统一缓存文件存储规范。下载后的操作，由回调决定，iOS、Android一致
        function downloadFileIntoApp() {
            emp.downloadFileIntoApp({
                taskid: "down", //下载标识，将原样返回给毁掉函数，便于回调函数判断
                url: "http://wx3.sinaimg.cn/orj360/824aea72gy1fl2cfbgxcuj20qo1bgqbh.jpg", //文件下载路径
                success: function (res) { //下载成功后的回调函数
                    var taskid = res.taskid; //回传的下载标识
                    var absolutePath = res.absolutePath; //下载本地后文件在系统中的绝对路径
                    var filePath = res.filePath; //返回App内相对应用存储路径的相对路径，应用存储路径的根目录遵循移动门户App的统一缓存文件存储规范
                    confirm("success :" + taskid + "-" + absolutePath + "-" + filePath)
                },
                error: function (res) { //下载失败时的回调函数
                    //res  失败描述
                    var taskid = res.taskid; //是调用时的下载标识
                    confirm("default :" + taskid)

                }
            });
        }

        // 10.3 调用系统功能下载文件
        // 调用系统默认URL打开功能下载文件到Android系统中，文件下载保存路径应该在系统默认下载目录下。此文件不会保存到应用程序的目录中，按系统下载设置，看是优先保存在SD中，还是内部存储中。
        // 【Android】中，此文件会保存到系统默认下载路径中，行为与浏览器打开该URL一致
        // 【iOS】中，该方法将调用浏览器打开连接
        function downloadFileBySystem() {
            emp.downloadFileBySystem({
                taskid: 'down', //下载标识,将原样返回给回调方法，便于回调方法判断
                url: 'http://wx3.sinaimg.cn/orj360/824aea72gy1fl2cfbgxcuj20qo1bgqbh.jpg', // 文件下载路径
                success: function (res) { //下载成功后的回调函数
                    var tasked = res.taskid; //是调用时taskid
                    var absolutePath = res.absolutePath; //下载本地后文件路径，文件在系统中的全路径
                    var filePath = res.filePath; //返回存储路径的相对路径，应用存储路径的根目录遵循移动门户App的统一缓存文件存储规范；系统下载文件，该值与absolutePath一致
                    confirm("success :" + taskid + "-" + absolutePath + "-" + filePath)

                },
                error: function (res) { //下载失败时的回调函数
                    //res  失败描述
                    var taskid = res.taskid; //是调用时的taskid
                    confirm("default :" + taskid)

                }
            });
        }

        // 10.4 调用系统应用打开下载的文件
        // Android系统中， H5调用系统文件下载后，可根据系统情况，自动启动或提示启动应用打开下载文件。

        // 10.5 文件预览
        function docPreview() {
            emp.docPreview({
                downloadUrl: 'http://menhu-dev.thuniwhir.com/upload/fingersoft/doc.docx',
                success: function (res) {
                },
                error: function (res) {
                    confirm("warning: " + res.msg);
                }
            });
        }

        // 11. 窗口操作
        // 窗口是指打开一个独立H5应用容器，在一个H5容器中可新开一个H5容器，由于每一个H5应用容器本身需要维护一套相互独立的H5应用的运行环境，内存消耗较多，因此不建议随意开窗口，建议整个App内H5应用容器运行实例控制在3个以下。
        // 11.1    打开一个新的窗口
        // 新开一个H5应用容器，该容器在指定区域中
        function windowOpen() {
            emp.window.open({
                id: '1111', // 窗口标识,如果该标识窗口已经打开,则显示出来，如果没有就创建一个新H5应用容器，再显示出来
                title: '这是一个新的窗口', //窗口标题
                dataType: 0, //窗口填充数据类型, 0: url, 1:数据,
                data: 'https://www.baidu.com', //窗口填充的数据, dataType=0 是远程加载地址url， datatype=1时是HTML内容
                target: '', //指定的显示区域，该参数只有在屏幕上有多个显示区域时起作用，目前主要用于Pad版
            });
        }

        // // 11.2    关闭窗口
        // // 关闭指定的H5容器，
        function windowClose(id) {
            emp.window.close({
                id: id, //指定被关闭窗口标识，如果id=‘this‘，则关闭当前窗口
            });
            // 为了方便调用，此方法（在SDK层面实现）也兼容如下形式的调用：
            // emp.window.close(id);
        }

        // // 11.3    打开一个悬浮窗口/ 弹出框
        // // 打开一个悬浮h5应用容器窗口，区别于普通H5应用容器，它可以被指定长宽，以及屏幕上显示位置，可以看做一个可指定内容的对话框。
        function windowOpenPopover() {
            emp.window.openPopover({
                id: '001', // 窗口标识,如果该标识窗口已经打开,则显示出来，如果没有就创建一个新H5应用容器，再显示出来
                title: '悬浮窗', //窗口标题
                dataType: 0, //窗口填充数据类型, 0: url, 1:数据,
                data: 'https://www.baidu.com', //窗口填充的数据, dataType=0 是远程加载地址url， datatype=1时是HTML内容
                width: '300', //窗口宽度
                height: '300', //窗口高度
                left: '20', //弹出框距离左边的距离
                top: '300', //弹出框距离上边的距离
            });
        }

        // // 11.4    关闭悬浮窗口/ 弹出框
        // // 关闭指定的H5悬浮窗口，如果指定id对应的的不是悬浮窗口，将被忽略。
        function windowClosePopover(id) {
            emp.window.closePopover({
                id: id, //指定被关闭popover窗口标识，如果id=‘this‘，则关闭当前窗口
            });
            // 为了方便调用，此方法（在SDK层面实现）也兼容如下形式的调用：
            // emp.window.closePopover(id);
        }

        // // 11.5    弹出一个警告窗口
        // // 打开一个警告（Alert）窗口，用于替换H5应用容器默认的alert窗口，默认Alert窗口的title会显示当前H5应用容器加载的网页加载地址。警告框只有一个“确认”按钮。
        function windowAlert(content) {
            emp.window.alert({
                title: '标题', //窗口标题文字
                content: content, //警告框要显示的文本内容
                button: '确定', //按钮上显示的按钮名字
            });
        }

        // // 11.6    弹出一个确认窗口
        // // 打开一个警告（Confirm）窗口，用于替换H5应用容器默认的confirm窗口，默认Confirm窗口的title会显示当前H5应用容器加载的网页加载地址。确认窗口可以有两个按钮，这两个按钮名字，可由用户自定义，每个按钮对应的操作，也可以在callback中定义。
        // // function windowConfirm() {
        // //     emp.window.confirm({
        // //         title: '', //窗口标题文字
        // //         content: '', //窗口中显示文本内容
        // //         buttons: ['btn1', 'btn2'], //按钮名称数组，内容为按钮名称
        // //         success: function (res) {
        // //             var button = res.button; //用户点击的按钮名称
        // //         }
        // //     });
        // // }

        // // 弹出一个确认窗口
        function confirm(text) {
            emp.window.confirm({
                title: "确认标题",
                content: text,
                buttons: ["取消", "确定"],
                success: function (res) {
                    var button = res.button; //用户点击的按钮名称
                }
            });
        }

        // // 11.7    弹出一个可以输入内容的提示窗口
        // // 打开一个提示（prompt）窗口，用于替换H5应用容器默认的prompt窗口，默认prompt窗口的title会显示当前H5应用容器加载的网页加载地址。提示窗口有一个文本输入域，以及多个按钮。
        function windowAlertInput() {
            emp.window.alertInput({
                title: '可输入标题', //窗口标题文字
                content: '可输入展示内容', //窗口中显示文本内容
                defaultValue: '可输入默认内容',//输入框中默认输入值
                buttons: ['取消', '确定', '提交'], //按钮名称数组，内容为按钮名称
                success: function (res) {
                    var button = res.button; //用户点击的按钮名称
                    var inputValue = res.inputValue; //用户输入的内容
                }
            });
        }

        // // 11.8    刷新指定窗口
        // // 刷新指定窗口，重新载入该窗口当前的url。
        function windowRefresh(id) {
            emp.window.refresh({
                id: id, //窗口id
            });
            // 为了方便调用，此方法（在SDK层面实现）也兼容如下形式的调用：
            // emp.window.refresh(id);
        }

        // // 12. 界面功能
        // // 12.1 保留当前页面跳转
        function navigateTo() {
            emp.navigateTo({
                url: 'http://www.baidu.com',//跳转地址
                success: function () {
                }, //跳转成功回调
                error: function () {
                } //跳转失败回调
            });
        }

        // 12.2 关闭当前页面跳转
        function redirectTo() {
            emp.redirectTo({
                url: 'http://www.baidu.com',//跳转地址
                success: function () {
                }, //跳转成功回调
                error: function () {
                }, //跳转失败回调
            });
        }

        // 12.3 关闭当前页面回退前一页
        function navigateBack() {
            emp.navigateBack();
        }


        // 13. 标题栏设置
        // 13.1 设置标题栏内容
        // 只允许设置中间和右边内容
        // 注意：
        // 0. icon的属性为字符串，所填字符串为应用内置的图片
        function windowSetTitle() {
            emp.window.setTitle({
                title: {
                    text: '我是标题 title',
                    icon: '',
                    actionmenu: {}
                },
                rightMenu: {
                    text: '我是 Menu 按钮',
                    icon: '',
                    callback: function (result) {
                    }
                },
                titleaction: function (result) {
                    titleText: result.titleText;
                },
                rightmenuaction: function (result) {
                    rightText: result.rightText;
                }
            });
        }

        // // 13.2 菜单按钮
        // // 设置菜单中的菜单项按钮
        // 注意：
        // 0. 应该添加菜单的位置
        // 1. icon的属性为字符串，所填字符串为应用内置的图片
        function optionMenu() {
            emp.optionMenu({
                menuSite: 'right', // menuSite 值为 left/middle/right 默认值为 middle
                button: [{
                    name: '按钮1',//按钮名称
                    icon: '2',
                }, {
                    name: '按钮1',//按钮名称
                    icon: '2',
                }, {
                    name: '按钮1',//按钮名称
                    icon: '2',
                }],
                callback: function (res) {//点击按钮回调
                    button: res.buttonIndex;
                }
            });
        }

        // 应用服务号 跳转页面
        function publicSignPage() {
            window.location.href = "publicSign.jsp?userId=" + $("#userId").html();
        }

        // 扫码登录
        function qrLogin() {
            var $qrDiv = $("#qrDiv")
            if ($qrDiv.css("display") === 'none') {
                $qrDiv.slideDown();
            } else {
                $qrDiv.slideUp();
            }
        }

        // 刷新二维码扫码状态
        function refleshQRStatus(ticket) {
            $.ajax({
                type: "GET",
                url: "/h5online/qrLogin?type=reflesh&ticket=" + ticket,
                dataType: "json",
                success: function (data) {
                    console.log("status : " + data);
                    if (data.status) {
                        $("#qrInfo").html(data.status);
                        if (data.status === 'CHECK') {
                            debugger;
                            // 扫码登录成功
                            location.href = (data.checkUrl);
                        }
                    }
                }
            });
        }

        function createImSession() {
            emp.createImSession({
                type: 3, //会话类型,等于3时表示群聊会话.等于0时表示单聊会话
                groupId: "a1156bbd0e494009845a472eeba4ec4a",//群聊会话的id
                id: '',//单聊会话 对方的imid
                name: 'test'//会话名称
            });
        }

        function iAppOffice() {
            emp.jinge.openWebFile({
                hostUrl: "http://www.kinggrid.com:8080/iWebOffice2009/OfficeServer.jsp",//金格服务器url
                fileId: "1490444371683",//需要编辑的文件对应的文件id
                isPGFFormat: "1",//是否以PGF格式打开
                readOnly: "1",//是否只读模式打开
                userName: "test1",//当前用户名
                enterReviseMode: "0",//是否进入修订模式
                isScreenshotForbid: "1",//是否防截屏
            });
        }

        function request() {
            emp.request({
                url: 'i/im/user/getToken',
                body: {
                    imId: 'test@fingersoft'
                },
                success: function (res) {
                    confirm(res.result.msg);
                },
                error: function (error) {
                    confirm(JSON.stringify(error));
                }
            });
        }

        function videoStart() {
            emp.video.record({
                success: function (res) {
                    confim(res.localId);
                }
            });
        }

    </script>
</body>

</html>